Python - pandasデータ統合 (concat, join, merge)
目次
この投稿は、pandasライブラリを活用して複数のデータを一つに統合する方法について説明するために作成されました。
データを統合する方法にはいくつかありますが、今回扱うのは concat, join, mergeです。
説明する前に、例として2つのデータフレームを作成しましょう。
>>> import pandas as pd
>>> df1 = pd.DataFrame({
'Class1' : [95, 92, 98, 100],
'Class2' : [91, 93, 97, 99]
})
>>> df2 = pd.DataFrame({
'Class1' : [87, 89],
'Class2' : [85, 90]
})
d1の出力値:
Class1 | Class2 | |
---|---|---|
0 | 87 | 85 |
1 | 89 | 90 |
d2の出力値:
Class1 | Class2 | |
---|---|---|
0 | 95 | 91 |
1 | 92 | 93 |
2 | 98 | 97 |
3 | 100 | 99 |
1. concat #
pandasライブラリの concat 関数はデータフレームを連結するために使用されます。この関数は複数のデータフレームを行または列方向に連結することができます。
df1とdf2をresultに連結しましょう。
>>> result = pd.concat([df1, df2])
>>> result
Class1 | Class2 | |
---|---|---|
0 | 95 | 91.0 |
1 | 92 | 93.0 |
2 | 98 | 97.0 |
3 | 100 | 99.0 |
4 | 87 | 85.0 |
5 | 89 | 90.0 |
6 | 96 | NaN |
7 | 83 | NaN |
**pd.concat([df1, df2])**は df1と df2を行の方向に連結します。つまり、2つのデータフレームが上下に接続されます。
次に、Class1列のみを持つd3をresultに統合しましょう。
>>> df3 = pd.DataFrame({
'Class1' : [96, 83]
})
>>> pd.concat([result, df3], ignore_index=True)
Class1 | Class2 | |
---|---|---|
0 | 95 | 91.0 |
1 | 92 | 93.0 |
2 | 98 | 97.0 |
3 | 100 | 99.0 |
4 | 87 | 85.0 |
5 | 89 | 90.0 |
6 | 96 | NaN |
7 | 83 | NaN |
d3データは’Class2’列を持っていないため、空白値が出力されます。
2. join #
pandasライブラリのj join メソッドは、2つのデータフレームを特定の列を基準に結合するために使用されます。一般的にSQLの JOIN 操作と同様の役割を果たします。 concatとは異なり、 joinは横方向に統合されます。
>>> df4 = pd.DataFrame({
'Class3' : [93, 91, 95, 98]
})
>>> df1.join(df4)
Class1 | Class2 | Class3 | |
---|---|---|---|
a | 95 | 91 | 93 |
b | 92 | 93 | 91 |
c | 98 | 97 | 95 |
d | 100 | 99 | 98 |
次のようにインデックスを任意に設定して出力することも可能です。
>>> index_label = ['a','b','c','d']
>>> df1a = pd.DataFrame({'Class1': [95, 92, 98, 100],
'Class2': [91, 93, 97, 99]}, index= index_label)
>>> df4a = pd.DataFrame({'Class3': [93, 91, 95, 98]}, index=index_label)
>>> df1a.join(df4a)
Class1 | Class2 | Class3 | |
---|---|---|---|
a | 95 | 91 | 93 |
b | 92 | 93 | 91 |
c | 98 | 97 | 95 |
d | 100 | 99 | 98 |
3. merge #
pandasライブラリのmerge関数は、2つのデータフレームを特定の列を基準にマージ(統合)するために使用されます。merge関数を使用すると、データフレーム間で共通の列を基準に結合することができます。
>>> df_A_B = pd.DataFrame({'販売月': ['1月', '2月', '3月', '4月'],
'製品A': [100, 150, 200, 130],
'製品B': [90, 110, 140, 170]})
>>> df_C_D = pd.DataFrame({'販売月': ['1月', '2月', '3月', '4月'],
'製品C': [112, 141, 203, 134],
'製品D': [90, 110, 140, 170]})
df_A_B
販売月 | 製品A | 製品B | |
---|---|---|---|
0 | 1月 | 100 | 90 |
1 | 2月 | 150 | 110 |
2 | 3月 | 200 | 140 |
3 | 4月 | 130 | 170 |
df_C_D
販売月 | 製品C | 製品D | |
---|---|---|---|
0 | 1月 | 112 | 90 |
1 | 2月 | 141 | 110 |
2 | 3月 | 203 | 140 |
3 | 4月 | 134 | 170 |
mergeを使って *‘販売月’*列を基準に2つのデータフレームをマージします。結果として ‘販売月’ 列を基準に2つのデータフレームが結合され、共通の列を中心にデータが整理されます。
>>> df_A_B.merge(df_C_D)
販売月 | 製品A | 製品B | 製品C | 製品D | |
---|---|---|---|---|---|
0 | 1月 | 100 | 90 | 112 | 90 |
1 | 2月 | 150 | 110 | 141 | 110 |
2 | 3月 | 200 | 140 | 203 | 140 |
3 | 4月 | 130 | 170 | 134 | 170 |
mergeメソッドを使用して2つのデータフレームを結合する4つの異なる方法を実装してみましょう。
>>> df_left = pd.DataFrame({'key':['A','B','C'], 'left': [1, 2, 3]})
>>> df_right = pd.DataFrame({'key':['A','B','D'], 'right': [4, 5, 6]})
1.
>>> df_left.merge(df_right, how='left', on = 'key')
key | left | right | |
---|---|---|---|
0 | A | 1 | 4.0 |
1 | B | 2 | 5.0 |
2 | C | 3 | NaN |
‘key’列を基準にdf_leftとdf_rightを左結合(left join)します。左結合は左データフレーム(df_left)の全ての行を保持し、右データフレーム(df_right)の該当するキー値がある行を追加します。該当するキー値が右データフレームにない場合はNaNで埋められます。
2.
>>> df_left.merge(df_right, how='right', on = 'key')
key | left | right | |
---|---|---|---|
0 | A | 1.0 | 4 |
1 | B | 2.0 | 5 |
2 | D | NaN | 6 |
‘key’列を基準にdf_leftとdf_rightを右結合(right join)します。右結合は右データフレーム(df_right)の全ての行を保持し、左データフレーム(df_left)の該当するキー値がある行を追加します。該当するキー値が左データフレームにない場合はNaNで埋められます。
3.
>>> df_left.merge(df_right, how='outer', on = 'key')
key | left | right | |
---|---|---|---|
0 | A | 1.0 | 4.0 |
1 | B | 2.0 | 5.0 |
2 | D | 3.0 | NaN |
3 | D | NaN | 6.0 |
‘key’列を基準にdf_leftとdf_rightを外部結合(outer join)します。外部結合は両方のデータフレームの全ての行を含み、一方のデータフレームにのみ該当する場合はNaNで埋められます。
4.
>>> df_left.merge(df_right, how='inner', on = 'key')
key | left | right | |
---|---|---|---|
0 | A | 1 | 4 |
1 | B | 2 | 5 |
‘key’列を基準にdf_leftとdf_rightを内部結合(inner join)します。内部結合は両方のデータフレームに共通して存在する行のみを含みます。つまり、両方のデータフレームで同じ’key’値を持つ行を結合します。